#include "GetDB.hpp"

namespace chatroom{
    class ChatSessionMemTable{
        public:
            using Ptr = std::shared_ptr< ChatSessionMemTable>;
            ChatSessionMemTable(std::shared_ptr<odb::core::database> db):_db(db){}
            // 向指定会话中添加单个成员。
            bool append(ChatSessionMember& CSM)
            {
                try{
                    //开启事务
                    odb::transaction t(_db->begin());
                    _db->persist(CSM);
                    t.commit();
                }catch(std::exception& e){
                    Logger_ERROR("往{}添加数据失败,{}",CSM->get_session_id(),e.what());
                    return false;
                }
                return true;
            }
            // 向指定会话中添加多个成员。
            bool multi_append(std::vector<ChatSessionMember>& vv)
            {
                try{
                    //开启事务
                    odb::transaction t(_db->begin());
                    for(int i = 0;i<vv.size();i++)
                    {
                        _db->persist(vv[i]);
                    }
                    t.commit();
                }catch(std::exception& e){
                    Logger_ERROR("添加成员失败{}-{}",vv.size(),e.waht());
                    return false;
                }
                return true;
            }
            // 从指定会话中删除单个成员。删除也需要先查询存在该数据
            bool remove(ChatSessionMember& CSM)
            {
                try{
                   //开启事务
                    odb::transaction t(_db->begin());
                    typedef odb::query<chatroom::ChatSessionMember> query;
                    typedef odb::result<chatroom::ChatSessionMember> result;
                    auto ret = _db->erase_query<chatroom::ChatSessionMember>(query::session_id == CSM.get_session_id() && query::user_id == CSM.get_user_id());
                    t.commit();
                }catch(std::exception& e){
                    Logger_ERROR("删除指定用户{}失败,{}",CSM.get_user_id(),e.what());
                    return false;
                }
                return true;
            }
            // 通过会话 ID，获取会话的所有成员 ID。
            std::vector<string> get_all(std::string& ssid)
            {
                std::vector<string> res;
                try{
                    //开启事务
                    odb::transaction t(_db->begin());
                    typedef odb::query<chatroom::ChatSessionMember> query;
                    typedef odb::result<chatroom::ChatSessionMember> result;
                    result r(_db->query<chatroom::ChatSessionMember>(query::session_id==ssid));
                    for(auto i(r.begin()); i != r.end(); ++i)
                    {
                        res.push_back(i->get_user_id());
                    }
                    t.commit();
                }catch(std::exception& e){
                    Logger_ERROR("获取会话ID{}中成员失败",ssid,e.what());
                    return res;
                }
                return res;
            }
            // 删除会话所有成员：在删除会话的时候使用。
            bool remove_all(std::string& ssid)
            {
                try{
                    //开启事务
                    odb::transaction t(_db->begin());
                    typedef odb::query<chatroom::ChatSessionMember> query;
                    typedef odb::result<chatroom::ChatSessionMember> result;
                    auto ret = _db->erase_query<chatroom::ChatSessionMember>(query::session_id==ssid);
                    t.commit();
                }catch(std::exception& e){
                    Logger_ERROR("删除会话所有成员失败{}",ssid,e.what());
                    return false;
                }
                return true;
            }
        private:
            std::shared_ptr<odb::core::database> _db;
    };
}